/*
    消费者类定义：对订阅者的描述，当客户端通过信道订阅消息队列的时候，就需要在信道中维护一个消费者对象，当接收到消息推送的时候，就可以通过消费者对象里的回调函数进行处理
        属性：标签、队列名称、自动应答标志、回调函数
    注1：客户端的消费者不需要像服务端那样以队列为单位进行管理起来，直接和信道关联即可
    注2：消费者标签是消费者的标识，在一个信道中用于区分不同的消费者，但是本项目简化处理，一个信道只能对应一个消费者，但是标签可以验证得到的推送消息是否属于当前信道的消费者
*/
#pragma once
#include <string>
#include <memory>
#include <functional>
#include "../common/message.pb.h"


namespace mq
{
    // 消费者类
    struct Consumer
    {
        using ConsumerPtr = std::shared_ptr<Consumer>;
        using Callback = std::function<void(const std::string& tag, const BasicProperties *bp, const std::string& body)>;

        Consumer() {}
        Consumer(const std::string &tag, const std::string &queue_name, bool auto_ack, const Callback &callback)
            : _tag(tag), _queue_name(queue_name), _auto_ack(auto_ack), _callback(callback)
        {
        }

        std::string _tag;        // 标签
        std::string _queue_name; // 队列名称
        bool _auto_ack;          // 自动应答标志
        Callback _callback;      // 回调函数
    };
}